#pragma once
// 把所有的文件描述符进行封装，形成一个Connection类，每个Connection对象代表一个连接
#include <iostream>
#include <string>
#include <memory>
#include <functional>

#include "InetAddr.hpp"
#include "EpollServer.hpp"

class EpollServer;  

using func_t = std::function<void()>;

// connection类有 普通的fd，Listensockfd; --> 普通的fd与Listensockfd中的read是不一样的。 但是我想让fd的处理方式一样
class Connection 
{
public:
    Connection(int sockfd)
        : _sockfd(sockfd)
    {}
    ~Connection()
    {}

    void InitCB(func_t recver, func_t sender, func_t excepter)
    {
        _recver = recver;     // 如果我是listen，如果我是fd
        _sender = sender;
        _excepter = excepter;
    }

    // 设置客户端信息
    void SetPeerInfo(const InetAddr& peer_addr)
    {
        _peer_addr = peer_addr;
    }
    
    int SockFd()
    {
        return _sockfd;
    }

    void SetEvents(uint32_t events)
    {
        _events = events;
    }

    uint32_t GetEvents()
    {
        return _events;
    } 
    void CallRecver()
    {
        if(_recver != nullptr)
            _recver();
    }
    void CallSender()
    {
        if(_sender != nullptr)
            _sender();
    }

private:
    int _sockfd;
    std::string _inbuffer; // 输入缓冲区 --> 没有读完整没关系用inbuffer进行缓存
    std::string _outbuffer;// 输出缓冲区
    InetAddr _peer_addr;   // 客户端地址

    // 回调函数
    func_t _recver;
    func_t _sender;
    func_t _excepter;

    // 添加一个指针
    EpollServer* _owner;

    // 我关心的事件
    uint32_t _events;
};
